package com.banyuan.utils;
import java.lang.reflect.Field;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

public class DBUtils {

    public static <E> List<E> resultToBeanAll(ResultSet rs, Class<E> clazz) {
        ArrayList<E> list = new ArrayList<>();
        try {
            //遍历结果集
            ResultSetMetaData metaData = rs.getMetaData();
            int fieldNum = metaData.getColumnCount();//获取结果集中表头字段的数量


            //遍历结果集中的数据
            while (rs.next()) {
                //创建封装数据的对象
                E e = clazz.newInstance();
                //遍历表头取数据
                for (int i = 1; i <= fieldNum; i++) {
//                    String fieldName = metaData.getColumnName(i);
                    String fieldName = metaData.getColumnLabel(i);
//                    能处字段理别名

                    //获取结果集中这一列的数据的值
                    Object obj = rs.getObject(fieldName);
                    //获取Bean(就是上面那个e)中的成员变量
                    Field field = clazz.getDeclaredField(fieldName);
                    field.setAccessible(true);
                    field.set(e, obj);
                }
                //将封装好数据的对象存入到集合中
                list.add(e);
            }

        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        }

        return list;
    }

    public static <E> E resultToBeanOne(ResultSet rs, Class<E> clazz) {
        E el = null;
        try {
            //遍历结果集
            ResultSetMetaData metaData = rs.getMetaData();
            int fieldNum = metaData.getColumnCount();//获取结果集中表头字段的数量
            el = clazz.newInstance();//创建封装数据的对象
            //遍历结果集中的数据
            if (rs.next()) {
                //遍历表头取数据
                for (int i = 1; i <= fieldNum; i++) {
//                    String fieldName = metaData.getColumnName(i);
                    String fieldName = metaData.getColumnLabel(i);

                    //获取结果集中这一列的数据的值
                    Object obj = rs.getObject(fieldName);
                    //获取Bean(就是上面那个e)中的成员变量
                    Field field = clazz.getDeclaredField(fieldName);
                    field.setAccessible(true);
                    field.set(el, obj);
                }
            }

        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        }

        return el;
    }
}
